﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StudentLibrary.Module.Util
{
    /// <summary>
    /// Класс для взаимодействия с базой данных SQLite
    /// </summary>
    internal static class SQLite
    {
        /// <summary>
        /// Параметры для подключения к базе данных
        /// </summary>
        private static readonly string _connectionString = "Data Source=library.db;Version=3;";
        /// <summary>
        /// Подключение к базе данных
        /// </summary>
        private static readonly SQLiteConnection _bd = new SQLiteConnection(_connectionString);

        /// <summary>
        /// Соединение к базе данных
        /// </summary>
        internal static void Open() => _bd.Open();
        /// <summary>
        /// Отключение от базы данных
        /// </summary>
        internal static void Close() => _bd.Close();

        /// <summary>
        /// Обращается к базе данных по запросу
        /// </summary>
        /// <param name="sql">Запрос</param>
        /// <returns>Таблицу со всеми типами</returns>
        internal static DataTable SQLQueryAsDataTable(this string sql)
        {
            var dt = new DataTable();

            using (SQLiteCommand command = new SQLiteCommand(sql, _bd))
            {
                using (SQLiteDataReader reader = command.ExecuteReader())
                {
                    if (reader.CanGetColumnSchema())
                    {
                        dt.Columns.AddRange(reader.GetColumnSchema().Select(x => new DataColumn(x.ColumnName, x.DataType)).ToArray());
                    }
                    else
                    {
                        dt.Columns.AddRange(Enumerable.Range(0, reader.FieldCount)
                                                      .Select(x => new DataColumn(reader.GetName(x), reader.GetFieldType(x)))
                                                      .ToArray());
                    }

                    while (reader.Read())
                    {
                        DataRow row = dt.NewRow();
                        foreach(DataColumn col in dt.Columns)
                        {
                            row[col.ColumnName] = reader[col.ColumnName];
                        }
                        dt.Rows.Add(row);
                    }
                }
            }
            return dt;
        }

        /// <summary>
        /// Обращается к базе данных по запросу
        /// </summary>
        /// <param name="sql">Запрос</param>
        /// <param name="parm">Параметры по составленному запросу</param>
        /// <returns>Вернёт <see langword="true"/> при успехе операции, иначе <see langword="false"/> </returns>
        internal static bool SQLNoneQueryWithParametrs(this string sql, Dictionary<string, string> parm)
        {
            using (SQLiteCommand command = new SQLiteCommand(sql, _bd))
            {
                foreach (KeyValuePair<string, string> pair in parm)
                {
                    command.Parameters.AddWithValue(pair.Key, pair.Value);
                }
                return command.ExecuteNonQuery() > 0;
            }
        }
        /// <summary>
        /// Обращается к базе данных по запросу
        /// </summary>
        /// <param name="sql">Запрос</param>
        /// <returns>Вернёт <see langword="true"/> при успехе операции, иначе <see langword="false"/> </returns>
        internal static bool SQLNoneQuery(this string sql)
        {
            using (SQLiteCommand command = new SQLiteCommand(sql, _bd))
            {
                return command.ExecuteNonQuery() > 0;
            }
        }
    }
}
